package com.china08.yxyapi.schedule.statistics;

import java.util.Date;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.china08.yxyapi.repository.db.YxyResResourceRepository;
import com.china08.yxyapi.service.mg.impl.UserUploadResourceServiceImpl;
import com.china08.yxyapi.util.DateUtils;
import com.china08.yxyapi.util.RabbitMqSendUtil;
import com.china08.yxyapi.util.YxyScheduleRunnableUtil;

@Component
public class UserResourceStatisticsTask {

    @Autowired
    YxyResResourceRepository yxyResResourceRepository;

    @Autowired
    UserUploadResourceServiceImpl userUploadResourceServiceImpl;

    private static final Logger log = LoggerFactory.getLogger(UserResourceStatisticsTask.class);

    // CRON表达式 含义
    // "0 0 12 * * ?" 每天中午十二点触发
    // "0 15 10 ? * *" 每天早上10：15触发
    // "0 15 10 * * ?" 每天早上10：15触发
    // "0 15 10 * * ? *" 每天早上10：15触发
    // "0 15 10 * * ? 2005" 2005年的每天早上10：15触发
    // "0 * 14 * * ?" 每天从下午2点开始到2点59分每分钟一次触发
    // "0 0/5 14 * * ?" 每天从下午2点开始到2：55分结束每5分钟一次触发
    // "0 0/5 14,18 * * ?" 每天的下午2点至2：55和6点至6点55分两个时间段内每5分钟一次触发
    // "0 0-5 14 * * ?" 每天14:00至14:05每分钟一次触发
    // "0 10,44 14 ? 3 WED" 三月的每周三的14：10和14：44触发
    // "0 15 10 ? * MON-FRI" 每个周一、周二、周三、周四、周五的10：15触发
    /** 每天一点触发，统计前一天数据 **/

    /**
     * 根据月份统计本月上传与分享的资源
     */
    @Scheduled(cron = "0 25 0 * * ?")
    public void resResourceForMonthTask() {

        // ##
        // 检测定时任务是否可执行
        if (!YxyScheduleRunnableUtil.checkRunnable()) { return; }

        // 查询 本月上传资源的用户,
        List<Object[]> lObjects = yxyResResourceRepository.findByUploadTime(
                DateUtils.getFirstDay(DateUtils.getMothOfFirstDay(new Date())),
                DateUtils.getTimesnight(DateUtils.getMothOfLastDay(new Date())));

        // 统计本月的资源是否有用户上传

        if (lObjects != null && !lObjects.isEmpty()) {
            // 根据月份统计当月上传与分享的资源
            RabbitMqSendUtil.ywStatisticsResourceMonth(DateUtils.formatDate6(new Date()));
        }
    }

    /**
     * 统计本年上传与分享的资源
     */
    @Scheduled(cron = "0 0 0/2 * * ?")
    public void resResourceForYearTask() {

        // ##
        // 检测定时任务是否可执行
        if (!YxyScheduleRunnableUtil.checkRunnable()) { return; }

        userUploadResourceServiceImpl.uploadResourceStatisticsForYear();
    }

    /**
     * 统计全部上传与分享的资源
     */
    @Scheduled(cron = "0 0 0/2 * * ?")
    public void resResourceForTotalTask() {

        // ##
        // 检测定时任务是否可执行
        if (!YxyScheduleRunnableUtil.checkRunnable()) { return; }

        userUploadResourceServiceImpl.uploadResourceStatisticsForTotal();
    }
}
